#include "mythread.h"
#include <QElapsedTimer> // 这个类可以计算某个流程所用的时间
#include <QDebug>
#include <QDateTime>
#include <qalgorithms.h>
#include <QThread>

Generate::Generate(QObject *parent) : QObject(parent)
{

}

void Generate::working(int num)
{
    qDebug() << "生成随机数线程的地址为：" << QThread::currentThread();
    // 设置随机数种子
    qsrand(QDateTime::currentMSecsSinceEpoch());
    QVector<int> list;
    QElapsedTimer time;
    time.start();

    for (int i = 0; i < num; i++)
    {
        list.push_back(qrand() % 10000);
    }
    int milsec = time.elapsed();
    qDebug() << "生成：" << num << "随机数一共用时：" << milsec << "毫秒";

    // 逻辑写完之后发送信号
    emit this->sendArray(list);
}
// 冒泡排序
BubbleSort::BubbleSort(QObject *parent) : QObject(parent)
{

}

void BubbleSort::working(QVector<int> list)
{
    qDebug() << "生成随机数线程的地址为：" << QThread::currentThread();
    QElapsedTimer time;
    time.start();
    for (int i = 0; i < list.size(); i++)
    {
        for (int j = 0; j <  list.size() - i - 1; j++)
        {
            if (list[j] > list[j+1])
            {
                qSwap(list[j],list[j+1]);
            }
        }
    }

    int milsec = time.elapsed(); // 这个可以计算出这个执行这个for循环用了多少时间 并且返回一个值(毫秒)
    qDebug() << "冒泡排序生成用时：" << milsec << "毫秒";
    emit finish(list);
}

// 快速排序
QuickSort::QuickSort(QObject *parent) : QObject(parent)
{

}

void QuickSort::working(QVector<int> list)
{
    qDebug() << "生成随机数线程的地址为：" << QThread::currentThread();
    QElapsedTimer time;
    time.start();
    // 快速排序
    this->quickSort(list,0,list.size() - 1);

    int milsec = time.elapsed(); // 这个可以计算出这个执行这个for循环用了多少时间 并且返回一个值(毫秒)
    qDebug() << "快速排序生成用时：" << milsec << "毫秒";
    emit finish(list);
}

void QuickSort::quickSort(QVector<int> &list, int left, int right)
{
    int i = left;
    int j = right;
    if (left > right)
    {
        return;
    }
    int piovt = list[(left + right) / 2];

    while (i <= j) {
        while (list[i] < piovt)
        {
            i++;
        }
        while (list[j] > piovt)
        {
            j--;
        }

        if (i <= j)
        {
            qSwap(list[i],list[j]);
            i++;
            j--;
        }

    }
    quickSort(list,left,j);
    quickSort(list,i,right);
}
